Mise α jour : 04 Fevrier 1997 .

Page en perpΘtuelle construction !

ATTENTION !!!


Cette page devra Ωtre consommΘe avec modΘration ! Les techniques de programmation avancΘes qui vous seront enseignΘes - avec en plus possibilitΘ de tΘlΘchargement ! - risquent de vous rendre insomniaque ...
UN CONSEIL : RΘglez votre rΘveil α 2h du matin : Il vous indiquera qu'il faut d'urgence vous coucher !!!


Et voici un premier programme , pour vous faire patienter , qui intΘressera plus d'un :
Comment piloter la sortie parallΦle de son PC ? (Sortie imprimante)
Voici tout d'abord le programme . Le source et un schΘma Θlectronique simple sera disponible en tΘlΘchargement.

program CENTRONIC;

{ Programme Pascal pour envoyer des donnΘes sur le port parallΦle }
{ 12/08/96 Hoareau Bertrand }
uses CRT;
VAR I:longint;
j,valeur:byte;
a:char;

procedure init_port;assembler;
ASM
    mov DX,037bh {Registre de controle}
    mov Al,080h
    out DX,Al {initialisation}
End;


Procedure envoie(data:byte);assembler;
ASM
    mov DX,0378h {L'adresse du port centronic Θtant 0378h sur mon PC}
    mov Al,data
    out DX,Al {envoie data }
End;

Begin
    clrscr;
    init_port; writeln('Tapez ECHAP pour sortir');
    writeln;
    valeur:=255; {Pour mettre α 1 D0 α D7}
    repeat
      writeln('Mise α 1 des sorties :');
      envoie(valeur); {Mise α 1 des sorties d0 α d7}
      a:=readkey;
      writeln('Mise α zΘro des sorties:');
      envoie(0); {Mise α zero des sorties d0 α d7}
      a:=readkey;
    until ord(a)=27;

    {Note: Pour activer sortie d0: Valeur:= 1;
          d1: Valeur:= 2;
          d2: Valeur:= 4;
          d3: Valeur:= 8;
          dn: valeur:= 2^n;
    Si vous voulez activer sortie d0 et d1 , Valeur = 1+2=3 }
end.

TΘlΘchargement !
Le source CENTRON.PAS
Le schΘma Θlectronique



Pixel, palette, sprite,scrolling,synchro

Avant de se lancer dans les modes graphiques du PC, il faut comprendre la signification des termes Pixels, Palette et Sprite.
Dans le mode VGA 256 couleurs, chaque pixel (point sur l'Θcran) occupe 1 octet (8bits) en mΘmoire.
Cet octet ne donne pas directement les 3 composantes RVB de la couleur mais pointe dans une table α 256 (2^8) entrΘes appelΘe Palette de couleur.

Un sprite est un bloc de pixels rectangulaire , mais certains pixels sont transparents , ce qui permet de faire apparaitre le fond du dΘcor. GΘnΘralement la couleur de transparence utilisΘe est le noir (Couleur 0 dans la palette). Une routine chargΘe d'afficher un sprite α l'Θcran va scruter le bloc , pixel par pixel , et afficher uniquement les pixels qui ne sont pas noirs .

Le scrolling est l'art de faire dΘfiler un Θcran, c'est α dire de dΘplacer les objets graphiques de 1 ou plusieurs pixels vers le haut/bas (scrolling vertical) ou la droite/gauche (scrolling horizontal).
Le scrolling demande beaucoup de ressources machines et les zones critiques de l'algorithme de scroll doivent etre programmΘes en assembleur pour obtenir de bons rΘsultats.

La synchronisation VBL est une notion capitale α comprendre. Un gros problΦme, lorsque l'on anime des objets α l'Θcran (scrolling, sprite) est que l'image est dΘformΘe ou scintille dΘsagrΘablement . Pour Θliminer ce problΦme il faut synchroniser l'affichage des ΘlΘments graphiques avec le retour vertical du canon α Θlectrons qui balaye l'Θcran et utiliser un Θcran logique (mΘthode du double Θcran que nous verrons plus tard).
Un top VBL est dΘclenchΘ α chaque fois que le rayon a atteint l'extrΘmitΘ infΘrieure droite de l'Θcran et qu'il est ramenΘ sur la premiΦre ligne en haut α gauche de l'Θcran. J'utilise d'ailleurs la synchro VBL pour rΘaliser mes tempos. C'est la seule garantie en turbo pascal sur PC pour obtenir une tempo qui est α peu prΦs la mΩme quelque soit le PC utilisΘ (du 286 au pentium). L'instruction Delay du T.Pascal est α proscrire!

Et voici le programme (assembleur) trΦs cours qui vous permet de vous synchroniser avec le balayage Θcran :

WaitRetrace proc pascal far

    mov dx,3dah
    wait1:
    in al,dx
    test al,8h
    jnz wait1
    wait2:
    in al,dx
    test al,8h
    jz wait2
    ret

Note : On a deux boucles afin d'Ωtre s√r qu'on a bien attendu 1 retour entier de balayage Θcran (la premiΦre boucle pouvant trΦs bien commencer au moment ou le retour se termine (=fin) ...)


LE MODE 13h du BIOS


Le mode 13h est un mode qui permet d'afficher facilement un point sur l'Θcran. Au niveau mΘmoire, l'espace α adresser commence au segment A000. A chaque pixel sur l'Θcran correspond un octet (en mΘmoire) qui reprΘsente sa couleur (L'octet est en fait un pointeur sur une couleur de la palette). Les adresses se suivent dans l'ordre de balayage du rayon cathodique.
Ainsi , point (0,0) correspond α un offset de 0, le point (0,1) α un offset de 320 etc jusqu'au point (319,199) = offset 63999.
(Je rappelle qu'ici l'offset est le dΘplacement par rapport α l'adresse de base de l'Θcran c-a-d A000)

Tout pixel a donc une adresse de formule : offset = Y*320+X.
Pour allumer un point en mode 13h, il suffit donc de faire un Poke A000h+offset , couleur.

Il faut tout de mΩme savoir que l'adressage linΘaire du mode 13h n'est en fait qu'une simulation. En rΘalitΘ la carte VGA reconvertit l'adresse linΘaire en une adresse de plans. Les deux lignes d'adresses infΘrieures (bit 0 et 1 de l'offset) servent α sΘlectionner sur quel plan nous allons Θcrire. Les 6 bits restants (2 α 7) reprΘsentent l'adresse α l'intΘrieur du plan , aprΦs mise α 0 des bits 0 et 1. (Cela entraine un gaspillage de place car il alors impossible d'adresser tous les octets du plan de bit , mais c'est le prix α payer (sur Atari c'est pas aussi mer...))

Voici un petit programme simple qui fait dΘfiler des Θtoiles en utilisant le mode 13h.
Program Defil_etoiles;

Uses Crt;
Var Etoiles:Array[0..500] of Record
                              x,y,Plan:Integer;
                            End;
  nb_et:Word;

Procedure PutPixel(x,y,col:word);assembler;
{dessine le point (x,y) en couleur col (Mode 13h)}
asm
  mov ax,0a000h          {charge le segment}
  mov es,ax
  mov ax,320             {offset = Y*320 + X}
  mul y
  add ax,x
  mov di,ax              {charge l'offset }
  mov al,byte ptr col    {charge la couleur}
  mov es:[di],al         {et place le point}
End;

Begin
  Randomize;                  {initialise le gΘnΘrateur de nombres alΘatoires}
  asm mov ax,13h; int 10h End;    {dΘclenche le mode 13h }
  Repeat                          {exΘcution une fois par dessin d'Θcran}
    For nb_et:=0 to 500 do Begin  {nouvelle position pour chaque Θtoile}
      With Etoiles[nb_et] do Begin
        PutPixel(x,y,0);          {efface l'ancien pixel}
        Dec(x,Plan shr 5 + 1);    {effectue le dΘplacement}
        if x <= 0 Then Begin      {sortie α gauche  ?}
          x:=319;                 {alors rΘinitialisation }
          y:=Random(200);
          Plan:=Random(256);
        End;
        PutPixel(x,y,Plan shr 4 + 16);  {dessine le nouveau pixel}
      End;
    End;
    delay(100);
  Until KeyPressed;             {continue jusqu'α ce qu'on frappe une touche}
  TextMode(3);
End.

Vous avez donc lα dΘjα le moyen d'adresser la mΘmoire vidΘo et de dessiner ce que vous voulez !!!
En attendant la suite , amusez vous bien !
(nous reviendrons aussi sur ces histoires de plans assez compliquΘs α comprendre)
TΘlΘchargement !
ETOILES.PAS



Le mode 13h, c'est bien, mais nous allons tout de suite voir un deuxiΦme mode , le Mode X. Non, dΘsolΘ , c'est pas de l'affichage porno , c'est simplement un autre mode graphique qui nous permettra de ne plus faire de gaspillage mΘmoire (ouf), qui est plus rapide que le mode 13h et permet l'utilisation de PAGES , pour un affichage sans scintillement. Pour les sources pascal, un peu de patience, il faut que je fasse le tri dans tous mes programmes et routines pour pouvoir prΘsenter quelque chose de clair, sans quoi vous risqueriez de vous prendre la tΩte ...

LE MODE X



Le Mode X en programmation graphique dΘsigne une autre mΘthode pour Θcrire (ou lire) en mΘmoire vidΘo.
La mΘmoire vidΘo du PC est divisΘ en 4 plans (comme dans les mode 13h) . Ces 4 plans, accessibles pour le programmeur en lecture ou Θcriture, sont exploitΘs parallΦlement lorsqu'une image est affichΘe α l'Θcran, autrement dit les donnΘes en provenance de ces 4 plans sont lues simultanΘment par le processeur video.
En mode X, les plans sont remplis sans trou (contrairement au mode 13h) . Voilα, graphiquement, comment cela se prΘsente :

Pour afficher un point en mode X, il faut toujours connaεtre le numΘro du plan et l'offset (dΘplacement) par rapport au dΘbut plan sΘlectionnΘ.
La formule est :
plan = X mod 4 (donne le reste)
offset = Y*80 + X div 4

LES PAGES ECRANS


Nous allons parler maintenant des pages Θcrans , α ne pas confondre avec les plans de bits.
Lorsque vous affichez une image α l'Θcran, la qualitΘ est parfaite. Lorsque vous essayez de faire un peu d'animation en affichant successivement plusieurs images , les choses se gatent. Que vous soyez sous windows ou sous dos , sur atari, amiga ou pc , vous Ωtes confrontΘ toujours au mΩme problΦme : Scintillement, dΘchirement, sensation dΘsagrΘable de transparence, voir disparition partielle de l'image. Le problΦme est d√ α 2 causes essentielles:
1) Lorsque vous affichez une nouvelle image, vous ne savez pas ou se trouve le canon α Θlectron de votre Θcran : moralitΘ , si ce dernier est au milieu de l'Θcran, la nouvelle image sera dessinΘe α partir du milieu alors que l'ancienne sera toujours prΘsente dans la partie haute de votre Θcran , d'o∙ impression de dΘchirement.
2) MΩme si vous vous synchronisez avec le balayage Θcran (VBL) afin de renouveller l'image au moment ou votre canon α Θlectron est tout en bas de l'Θcran , vous n'aurez pas le temps en un retour balayage (c-a-d temps mis par le canon pour se repositionner en haut α gauche de l'Θcran) de mettre α jour votre nouvelle image (mΩme avec un pentium ...)
La solution α ce problΦme se nomme " XBIOS(5,Adresse_logique,Adresse_physique, r) " sur Atari , " WingG " sous Windows 95, "double buffering" en Java ... ( A ce propos, je me demande si c'est pas τα qui fatigue Microsoft Explorer 3.0, car lorsque j'utilise cette technique pour empΩcher le scintillement des images de mes puzzles JAVA , Microsoft explorer 3.0 est incapable d'afficher quoi que ce soit contrairement α Netscape 3.0 !!! )
Tout est basΘ sur le mΩme principe, α savoir : l'utilisation de 2 Θcrans , c-a-d de 2 zones en mΘmoire pour dessiner et afficher notre image. Le principe est simple : La nouvelle image sera dessinΘe sur un Θcran puis l'autre, alternativement. Pendant que le processeur calcule et dessine la nouvelle image sur un Θcran, le second Θcran est lui affichΘ . Ensuite on permute les deux Θcrans (en se synchonisant au VBL Θcran) , le processeur dessine alors sur le second Θcran pendant que le premier est affichΘ puis α nouveau permutation ...etc ....
L'opΘration de permutation est trΦs rapide puisqu'il suffit simplement de changer une adresse pour indiquer au processeur VidΘo la nouvelle adresse de la page Θcran.
Nous allons donc utiliser ce principe sous Dos , avec Turbo Pascal pour faire des animations . L'espace mΘmoire VidΘo dont nous disposons permet de loger 4 pages Θcrans en mode X en 320*200 en 256 couleurs (RΘsolution dite VGA) .
Bon la rΘsolution n'est pas terrible, c'est vrai, mais si vous connaissez un bon dessinateur , il pourra en jouant sur la palette des couleurs, donner une qualitΘ finale trΦs acceptable ! N'oubliez pas que de nombreux jeux rΘcents offrent toujours la rΘsolution VGA, car lorsque les calculs sont complexes (3D texturΘe temps rΘel par exemple) mΩme un pentium peut ramer !!! Un bon jeux, c'est avant tout un bon scΘnario et une bonne jouabilitΘ !
A suivre !


CapturΘ par MemoWeb α partir de http://www.guetali.fr/home/creole/Confirme.htm le 10/02/97